package main

import (
	"github.com/labstack/echo/v4"
	"github.com/labstack/echo/v4/middleware"
	"log"
	"net/http"
	"strings"
)

// Basic Auth 中间件提供了 HTTP 的基本认证方式。
//
// 对于有效的请求，则继续调用下一个处理程序 (handler) 。
// 对于丢失或无效的请求，则返回 "401 - Unauthorized" 响应。
func main() {

	e := echo.New()

	//使用一
	//e.Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
	//	if username == "admin" && password == "secret" {
	//		return true, nil
	//	}
	//	return false, nil
	//}))

	//使用二： 自定义 BasicAuthConfig （推荐）
	e.Use(middleware.BasicAuthWithConfig(CustomBasicAuthConfig()))

	e.GET("/index", Index)
	e.GET("/auth", Auth)

	e.Logger.Fatal(e.Start(":80"))

}

// CustomBasicAuthConfig
//
//	@Description: 自定义 BasicAuthConfig
//	@return middleware.BasicAuthConfig
func CustomBasicAuthConfig() middleware.BasicAuthConfig {
	m := middleware.BasicAuthConfig{
		Skipper: func(c echo.Context) bool {
			uri := c.Request().RequestURI
			if strings.Contains(uri, "/index") {
				log.Println("uri:", uri, "--->>>Skipper-true")
				return true
			}
			log.Println("uri:", uri, "--->>>Skipper-false")
			return false
		},
		Validator: func(username, password string, c echo.Context) (bool, error) {
			if username == "admin" && password == "123456" {
				return true, nil
			}
			//return false, echo.NewHTTPError(http.StatusUnauthorized) //认证失败，直接返回401，后续不再执行
			return false, nil //认证失败，返回401，继续(Skipper、Validator)
		},
		//realm 值将用于 WWW-Authenticate 头。 例如 Www-Authenticate: basic realm="auth123"
		Realm: "auth123", //默认 "Restricted"
	}
	return m
}

func Index(c echo.Context) error {
	return c.String(http.StatusOK, "index success!")
}

func Auth(c echo.Context) error {
	return c.String(http.StatusOK, "auth success!")
}
